package cn.cjj.gulimall.product.service.impl;

import cn.cjj.gulimall.product.entity.SkuInfoEntity;
import cn.cjj.gulimall.product.service.SkuInfoService;
import cn.cjj.gulimall.product.vo.SkuItemVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.cjj.common.utils.PageUtils;
import cn.cjj.common.utils.Query;

import cn.cjj.gulimall.product.dao.SkuSaleAttrValueDao;
import cn.cjj.gulimall.product.entity.SkuSaleAttrValueEntity;
import cn.cjj.gulimall.product.service.SkuSaleAttrValueService;


@Service("skuSaleAttrValueService")
public class SkuSaleAttrValueServiceImpl extends ServiceImpl<SkuSaleAttrValueDao, SkuSaleAttrValueEntity> implements SkuSaleAttrValueService {

    @Autowired
    SkuInfoService skuInfoService;

    @Autowired
    SkuSaleAttrValueService skuSaleAttrValueService;


    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<SkuSaleAttrValueEntity> page = this.page(
                new Query<SkuSaleAttrValueEntity>().getPage(params),
                new QueryWrapper<SkuSaleAttrValueEntity>()
        );

        return new PageUtils(page);
    }

    @Override
    public void saveSkuSaleAttrValue(List<SkuSaleAttrValueEntity> skuSaleAttrValueEntities) {
        this.saveBatch(skuSaleAttrValueEntities);
    }

    @Override
    public List<SkuItemVo.SkuItemSaleAttrVo> getSaleAttrsBySpuId(Long spuId) {
        List<SkuInfoEntity> skuInfos = skuInfoService.list(new QueryWrapper<SkuInfoEntity>().eq("spu_id", spuId));
        List<Long> skuIds = skuInfos.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());

        List<SkuSaleAttrValueEntity> skuSaleAttrValues = skuSaleAttrValueService.list(
                new QueryWrapper<SkuSaleAttrValueEntity>().in("sku_id", skuIds));

        Map<String, Set<Long>> attrValue2SkuId = new HashMap<>();
        Map<Long, SkuItemVo.SkuItemSaleAttrVo> skuItemSaleAttrs = new HashMap<>();
        skuSaleAttrValues.forEach(skuSaleAttrValue -> {
            Long skuId = skuSaleAttrValue.getSkuId();
            Long attrId = skuSaleAttrValue.getAttrId();
            String attrValue = skuSaleAttrValue.getAttrValue();
            String attrName = skuSaleAttrValue.getAttrName();
            if (!skuItemSaleAttrs.containsKey(attrId)) {
                SkuItemVo.SkuItemSaleAttrVo skuItemSaleAttr = new SkuItemVo.SkuItemSaleAttrVo();
                skuItemSaleAttr.setAttrValues(new ArrayList<>());
                skuItemSaleAttr.setAttrId(attrId);
                skuItemSaleAttr.setAttrName(attrName);
                skuItemSaleAttrs.put(attrId, skuItemSaleAttr);
            }
            if (!attrValue2SkuId.containsKey(attrValue)) {
                SkuItemVo.AttrValueWithSkuIdVo attrValueWithSkuId = new SkuItemVo.AttrValueWithSkuIdVo();
                attrValueWithSkuId.setAttrValue(attrValue);
                attrValueWithSkuId.setSkuIds(new HashSet<>());
                skuItemSaleAttrs.get(attrId).getAttrValues().add(attrValueWithSkuId);
                attrValue2SkuId.put(attrValue, new HashSet<>());
            }
            attrValue2SkuId.get(attrValue).add(skuId);
        });

        ArrayList<SkuItemVo.SkuItemSaleAttrVo> result = new ArrayList<>(skuItemSaleAttrs.values());
        result.forEach(SkuItemSaleAttr -> {
            SkuItemSaleAttr.getAttrValues().forEach(attrValue -> {
                attrValue.setSkuIds(attrValue2SkuId.get(attrValue.getAttrValue()));
            });
        });

        return result;
    }

    @Override
    public List<String> getSkuSaleAttrValuesAsStringList(Long skuId) {
        return this.baseMapper.getSkuSaleAttrValuesAsStringList(skuId);
    }

}